ES3 주요 스펙
함수가 호출되엇을 때 함수가 실행 되었을 때 실행될 수 있도록하는 환경과 함수의 결과를 저장하는 영역. 즉 함수의 모든 처리는 이 안에서 이뤄진다
- Function Object 엔진이 function 키워드를 만들었을 때 만드는 object
- Excutable Code(실행 가능한 코드)의 종류
- Global Code
- Eval Code
- Function Code Eval Code는 문자열이고, Global Code와 Function Code는 똑같은 코드지만, 영역이 다르기 때문에 두개를 나눠놨다.
- Variable Instantiation 변수의 인스턴스화 변수를 어떻게 인스턴스화 시켜서 처리할 것인가 하는 개념
- Scope Chain과 Identifier Resolution(식별자 해결) id는 함수 이름과 변수 이름을 뜻한다. 식별자 해결(결정)은 함수를 호출했을 때 어떻게 함수 이름을 찾을 것이냐, 변수에 값을 설정했을 때 어떻게 변수 이름을 찾을 것인가
- Global Object Function Object와 Global Object는 영역이 다르기 때문에, 두 개를 나눠놨다.
- Activation Object 함수가 호출되었을 때, 함수가 실행될 수 있는 환경과, 함수의 결과를 저장하는 오브젝트다. 오브젝트 이므로 Activation Object에는 프로퍼티들이 존재한다.
- This 인스턴스에서 위치를 나타냄
- Arguments Object 함수의 파라미터를 처리하는 오브젝트
ES5의 주요 스펙
실행 컨텍스트는 ES3나 ES5에서 역할이 다르진 않다. 그러나 ES3에서 추가된 개념들을 알아보자.
-
Strict Mode Code ES3의 Executable Code 개념에 추가된 개념으로,
use strict
를 사용했을 때의 실행 모드를 뜻한다. -
Lexical Environment Lexical은 dynamic에 반대되는 용어로 "정적"임을 의미한다. 자바스크립트는 "정적"환경을 취한다. 실행 컨텍스트가 하나의 실행의 묶음이라면, 그 안에서 환경적인 측면을 처리하는 것이 Lexical Environment다. Lexical Environment를 구성하는 하위개념은 다음과 같다.
- Environment Records 함수가 호출되어 "실행될 때" 그리고 "실행되기 전"에 정보를 기록하는 것
- Lexical Environment Operations 여러가지 의미가 있지만 "할당"이라고 봐도 될 듯하다. 어떤 변수에 값을 할당했을 때 그것을 "정적"인 환경에 설정한다는 것이다. 물론 Environment Record와 관련이 있다.
- Global Environment ES3의 Global Object를 처리하는 Environment다.
-
Declaration Binding Instantiation ES3에서 도입된 Variable Instantiation과 ES3에서 도입된 This와도 관계가 있다. 변수를 어떻게 실행컨텍스트의 environment에 record할 것이냐의 개념을 담고 있으며, this를 어떻게 binding 할 것이며 어떻게 record 할것이냐의 개념을 담고 있다.
함수와 관련된 키워드
- Excution Context
- Scope Chain & Identifier Resolution
- Activation Object
- Lexical Environment
여기서 정리한 키워드들은 "함수"와 관련이 있다. 자바스크립트에서 함수가 실행되기 전에 어떻게? 함수가 호출되었을 때 어떻게? 처리할 것이냐를 다룰 것이다.
실행 컨텍스트를 왜 묶음으로 가져가는가
왜 실행컨텍스트라는 환경을 묶음으로 묶는가?
- 식별자 해결(Identifier Resolution)을 위함이다. 함수나 변수의 이름을 찾는데, 그것이 실행 컨텍스트 안에 있다면 찾기가 쉽기 때문이다.
- 만약 실행 컨텍스트 바깥에 따로 정리해 둔다면, 따로 찾으러 왔다갔다 하는 로직이 있어야 되기 때문이다.(엔진 처리도 복잡해지고, 시간도 오래걸릴 것이다.)
- 현재 컨텍스트가 실행중이라는 것의 의미는 지금 메모리에 로드되고 CPU를 할당 받은 것인데, 변수나 함수를 찾자고 Memory에 접근하는 것은 매우 비효율적이다. 따라서 한 함수에 사용될 변수나 다른 함수를 실행 컨텍스트라는 묶음에 저장하는 것이다.
묶음으로 나누다 보니까, Scope라는 개념이 파생되었다.